With threads, tasks are executed parallel. The idea of cooperative multitasking is that tasks are chopped up in little pieces and executed serially. This way the program never has to switch contexts and there is no danger that finished threads change state in unexpected ways. In this video, you will see an experiment to call a blocking function from pyglet and make it behave asynchronously.